/***************************************************************************************************
  *Copyright(C),2010-2016,Sumscope
  *FileName	:  gbkmap.h
  *Author	:  scofined.qi
  *Version	:  1.0
  *Date		:  2015/12/22
  *Desc		:  //用于主要说明此程序文件完成的主要功能
  *Relation :  
  *Others	:  //其他内容说明
  *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
  *History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "BaseString.h"
#include "simple_array.h"

namespace qb{
namespace base{
	enum kGbkHanziType{
		kGbkHanziTypeGbk1=0,	// A1A1-A9FE	GB 2312 非汉字符号区，计符号 717 个
		kGbkHanziTypeGbk2,		// B0A1-F7FE	GB 2312 汉字区,收录汉字 6763 个
		kGbkHanziTypeGbk3,		// 8140-A0FE	扩充汉字区，收录 GB 13000.1 中的 CJK 汉字 6080 个
		kGbkHanziTypeGbk4,		// AA40-FEA0	扩充汉字区，收录 CJK 汉字和增补的汉字 8160 个CJK 汉字在前，按 UCS 代码大小排列 
		kGbkHanziTypeGbk5,		// A840-A9A0	GB 13000.1 扩充非汉字区，BIG-5 非汉字符号、结构符和“○”排列在此区。计符号 166 个
		kGbkHanziTypeUser1,		// 用户自定义区 AAA1-AFFE，码位 564 个
		kGbkHanziTypeUser2,		// 用户自定义区 F8A1-FEFE，码位 658 个
		kGbkHanziTypeUser3,		// 用户自定义区 A140-A7A0，码位 672 个
		kGbkHanziTypeCount
	};
    class CGbkMap{
		typedef unsigned char uchar;
		typedef unsigned short ushort;
        class GbkArea{
		public:
			uchar			lowLeft;
			uchar			lowRight;
			uchar			hiBottom;
			uchar			hiTop;
			int				count;
			bool			has7f;
			kGbkHanziType	type;
			GbkArea(){};
			GbkArea(ushort p1,ushort p2,kGbkHanziType t,int num);
			bool exist(uchar x,uchar y);
			unsigned short get(int i);
		};
		GbkArea	m_areas[kGbkHanziTypeCount];
	public:
		CGbkMap();
		bool IsHanzi(const unsigned char* gbk);
		bool IsGbkCode(const unsigned char* gbk);
		kGbkHanziType GetGbkType(const unsigned char* gbk);
		int GetCount();

		int GetHanziCount(kGbkHanziType type){return m_areas[type].count;}
		unsigned short GetHanzi(kGbkHanziType type,int i){return m_areas[type].get(i);}

		int GetAreaString(kGbkHanziType type,char* buf,int count);
		BaseString GetAreaString(kGbkHanziType type);
		bool IsGbkString(const char* str,int len);
		bool IsVisibleChar(unsigned char c);
	};



	// 繁T<==>简S汉字转化
	wchar_t S2T(wchar_t c);
	wchar_t T2S(wchar_t c);
	void STConvert(wchar_t* str,int len,bool s2t);


}//namespace base;
}//namespace qb;
